package com.qf.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author Kuke
 * @date 2022/2/18 13:55
 */
public class JdbcUtils {
    //声明数据源DataSource
    private static DataSource ds = null  ;
    //加入ThreadLocal<Connection>:每一个线程使用自己的Connection
    private static ThreadLocal<Connection> t1 = new ThreadLocal<>() ;
    private JdbcUtils(){} //外界不能创建当期类对象

    //静态代码块--->加载druid.properties配置文件
    static{
        try {
            //1)创建一个属性集合列表
            Properties prop = new Properties() ;
            //2)加载配置文件,获取配置文件所在的输入流对象
            InputStream inputStream = JdbcUtils.class.getClassLoader().
                    getResourceAsStream("jdbc.properties");
            //3)将资源输入流对象加载到属性列表中
            prop.load(inputStream) ;
            //4)druid.jar包---->DruidDataSourceFactory:工厂类--->创建数据源
            //4)获取数据源
            ds = DruidDataSourceFactory.createDataSource(prop) ;
          //  System.out.println(ds);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    //获取数据源
    public static DataSource getDataSource(){
        return  ds ;
    }

    //获取连接对象
    public static Connection getConnection(){
        Connection conn = null ;
        try {
            //从ThreadLocal获取自己的连接对象,获取它绑定的连接对象
            conn  = t1.get();
            if(conn==null){
                //当前线程中没有自己的连接对象,从连接池获取连接对象
                conn = ds.getConnection() ;
                //将当前连接对象,绑定自己的线程中
                t1.set(conn) ;
            }
            return  conn ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  null ;
    }

    //释放资源,针对查询语句操作
    public static void close(ResultSet rs,PreparedStatement stmt,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                //将连接对象从线程中解绑出来
                t1.remove() ;
                conn.close(); //归还连接池中
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //释放资源---针对添加,删除,修改
    public static void close(PreparedStatement stmt,Connection conn){

        //调用上面close
        close(null,stmt,conn);

    }

    //JDBC控制事务
    //开启事务并将连接对象释放调用(解绑)
    public static void setAutoCommit() throws SQLException {

        //获取连接对象
        Connection connection = getConnection();
        //开启事务
        connection.setAutoCommit(false) ;//禁用自动提交,切换手动提交

        //解绑
        t1.remove();
        connection.close(); //归还

    }

    //事务回滚并且解绑连接对象
    public static void rollbackAndClose() throws SQLException {
        //获取连接对象
        Connection connection = getConnection();
        //回滚事务
        connection.rollback();

        //解绑
        t1.remove();
        connection.close(); //归还
    }

    //提交事务并释放连接(解绑)
    public static void commitAndClose() throws SQLException {
        //获取连接对象
        Connection connection = getConnection();
        //提交事务
        connection.commit();

        //解绑
        t1.remove();
        connection.close(); //归还
    }

  /*  public static void main(String[] args) {
        //获取数据源
        *//*DataSource dataSource = JdbcUtils.getDataSource();
        System.out.println(dataSource);*//*
        Connection connection = JdbcUtils.getConnection();
        System.out.println(connection);
    }*/




}
